package oopday03;
//此类是用于验证多态的测试demo
/*PolymorphicDemo：创建Animal数组并填充Dog/Chick/Fish对象，遍历数组：
        - 输出每个动物的名字，让每个动物吃饭、喝水
     - 若为Dog，则让它看家。若为Chick，则让它下蛋。若能游泳，则让它游泳。
*/

public class PolymorphicDemo {
    public static void main(String[] args) {
        //演示向上造型（多态）的第2点应用:将不同子类对象封装到同一个父类数组
        //Animal[] o = new Animal();      //Animal类是一个抽象类，无法被实例化（无法创建对象）
        //创建一个Animal类型的数组,长度为5
        Animal[] animals = new Animal[5];
        animals[0] = new Dog("小黑", 2, "黑");     //向上造型
        animals[1] = new Dog("小白", 1, "白");
        animals[2] = new Fish("小金", 1, "金");
        animals[3] = new Fish("大金", 2, "金");
        animals[4] = new Chick("小灰", 3, "灰");

        //使用for循环遍历数组animals
        for (int i = 0; i < animals.length; i++) {
            System.out.println(animals[i].name);        //输出每个元素的name值
            animals[i].drink();     //调用每个元素的drink()方法
            animals[i].eat();       //调用每个元素的eat()方法

            //向下转型的要求：
            //-引用所指向的 对象类型，就是强制转换的目标类型
            //向下转型，将aa强制转换为Dog类型
            //向下转型，将aa强制转换为Swim类型
            if (animals[i] instanceof Dog) {    //使用instanceof判断
                Dog dog = (Dog) animals[i];
                dog.lookHome();
            }
            if (animals[i] instanceof Chick) {    //使用instanceof判断
                Chick chick = (Chick) animals[i];
                chick.layEggs();
            }

            if (animals[i] instanceof Swim) {    //使用instanceof判断
                Swim s = (Swim) animals[i];
                s.swim();
            }
        }

//演示向上造型（多态）的第1点应用：将父类作为参数类型，传递子类对象
        Master master = new Master();       //创建Master对象
        Dog dog = new Dog("小黑",2,"黑");
        Chick chick = new Chick("小花", 3, "花");
        Fish fish = new Fish("小金", 1, "金色");

        master.feed(dog);       //在传参的时候，系统自动完成向上造型，相当于  Animal animal = dog；
        master.feed(chick);     //在传参的时候，系统自动完成向上造型，相当于  Animal animal = chick；
        master.feed(fish);      //在传参的时候，系统自动完成向上造型，相当于  Animal animal = fish；

        //演示向上造型/自动类型转换的特点；
        //父类的引用 指向 子类对象
        //能点出来什么，看的是 引用 的类型
        Dog o1 = new Dog("小黑", 2, "黑");
        //o1可以调用:name/age/color/eat()/drink()/swim()/lookHome()
        Animal o2 = new Dog("小黑", 2, "黑");
        //o2可以调用：name/age/color/eat()/drink()/
        Swim o3 = new Dog("小黑", 2, "黑");
        //o3可以调用：swim()
        o3.swim();

    }
}


